package com.onpositive.mediawiki.propertyparser;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import storage.v1.ParserV2;

import com.onpositive.semantic.model.api.meta.IMeta;
import com.onpositive.semantic.model.api.property.IPropertyProvider;
import com.onpositive.units.ParsedIdent;
import com.onpositive.units.ParsedString;
import com.onpositive.units.ParsedValue;
import com.onpositive.units.ParsedValueSequence;
import com.onpositive.units.ParsedValueSequenceV2;
import com.onpositive.units.ValueCluster;

public class IdentParser extends AbstractExtendedParser<ParsedIdent> {

	public IdentParser() {
		super( ParsedIdent.class, ParsedIdent.ID );
	}

	@Override
	protected void indicateTargetValues(
			String str,
			ArrayList<Block<ParsedIdent>> blockList,
			IMeta meta,
			IPropertyProvider propertyProvider,
			Map<String, Object> metaInfo,
			String _comment )
	{
		String comment = getDefaultComment(_comment) ;
		
		int l = str.length() ;
		int prev = 0 ;
		for( int ind = str.indexOf("[["); ind >= 0 ; ind = str.indexOf("[[",prev) )
		{
			prev = str.indexOf("]]", ind ) ;
			if (prev==-1)
				break;
			ind = str.lastIndexOf("[[", prev) ;
			prev += 2 ;
			
			String value = str.substring(ind, prev) ;
			
			//TODO resolve internal refs into parsed sections
			if( str.startsWith("#") )
				continue ;
			
			ParsedIdent pi = new ParsedIdent(value, comment) ;
			Block<ParsedIdent> blk = new Block<ParsedIdent>(str, ind, prev, pi) ;
			blockList.add(blk) ;
		}
		
	}
	
	protected String preprocess(String s, IMeta meta,	IPropertyProvider propertyProvider, Map<String, Object> metaInfo)
	{
		return ParserV2.killWWWLinksAndSingleSquareBrackets(s) ;
	}
	
//	@Override
//	protected ParsedValue constructResultingValue( ArrayList<ParsedValue> clustersArray, String comment )
//	{
//		ParsedValue pv = super.constructResultingValue(clustersArray,comment) ;
//		ParsedValueSequence result = convertToPVS( pv, comment );		
//		return result ;
//	}
//
//	
//	private ParsedValueSequence convertToPVS(ParsedValue pv, String comment ) {
//		
//		ArrayList<ParsedString> lst = constructParsedStringArray( pv, comment ) ;
//		ParsedValueSequence result = new ParsedValueSequence( lst, comment) ;				
//		return result ;
//	}
	
	@Override
	protected boolean alwaysCut(){
		return false ;
	}

//	@SuppressWarnings("unchecked")
//	private ArrayList<ParsedString> constructParsedStringArray(ParsedValue pv, String comment)
//	{
//		ArrayList<ParsedString> result = new ArrayList<ParsedString>(); ;
//		if( pv instanceof ParsedString ){
//			result.add( (ParsedString) pv ) ;
// 
//		}else if( pv instanceof ParsedValueSequence ){			
//			for( ParsedValue pVal : (Iterable<ParsedValue>)pv.value() ){
//				ArrayList<ParsedString> res0 = constructParsedStringArray(pVal, comment) ;
//				result.addAll(res0) ;				
//			}
//		} else if( pv instanceof ValueCluster )			
//			result.add( new ParsedString( pv.getValueAsString(), comment) ) ;
//			
//		else if( pv instanceof ParsedValueSequenceV2 ){
//			
//			ParsedValueSequenceV2 pvsv2 = (ParsedValueSequenceV2) pv ;
//			for ( ParsedValue pVal : pvsv2.getValuesArray() ){				
//				ArrayList<ParsedString> res0 = constructParsedStringArray(pVal, comment) ;
//				result.addAll(res0) ;				
//			}			
//		} else
//			result.add( new ParsedString(pv.getValueAsString(), comment) ) ;
//		
//		return result ;
//
//	}

}
